package com.qf.service;

import com.qf.dao.CartDao;
import com.qf.dao.CartDaoImpl;
import com.qf.dao.GoodsDao;
import com.qf.dao.GoodsDaoImpl;
import com.qf.pojo.Cart;
import com.qf.pojo.Goods;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author fy
 * @version V1.0
 * @Project day41
 * @Package com.qf.service
 * @Description:
 * @Date 2022/5/25 10:45
 */
public class CartServiceImpl implements CartService{
    @Override
    public boolean createCart(Integer uid, Integer pid) {
        //1：根据用户id和商品id到数据库中查询是否已经有这个商品的数据
        CartDao cartDao = new CartDaoImpl();
        Cart cart = cartDao.findCartByUidAndPid(uid, pid);

        //根据商品id查询商品对象
        GoodsDao goodsDao = new GoodsDaoImpl();
        Goods goods = goodsDao.findById(pid);

        if (cart != null){
            //2:判断如果能够查询到这个购物项数据。进行购买数量的添加
           //购买件数+1
            cart.setNum(cart.getNum()+1);
            //重新计算总价钱=商品购买数量*商品单价
            cart.setMoney(cart.getNum()*goods.getPrice());
            //调用DAO将最新的购物数据更新到表中
            cartDao.updateCart(cart);

        }else {
            //3:如果查不到这个购物项的数据，那个作为新的购物项添加到数据库中
            //因为cart对象为null，所以需要创建购物车对象
            cart = new Cart();
            //用户id
            cart.setUid(uid);
            //商品id
            cart.setPid(pid);
            //购买数量
            cart.setNum(1);
            //将商品对象放入购物车中
            cart.setGoods(goods);
            //总计价钱=购买数量*商品单价
            cart.setMoney(cart.getNum()*goods.getPrice());
            cartDao.insertCart(cart);
        }
        return true;
    }

    @Override
    public List<Cart> findCartListByUid(Integer uid) {
        //根据用户id查询所有的购物项集合
        CartDao cartDao = new CartDaoImpl();
        List<Cart> cartList = cartDao.findCartListByUid(uid);

        //查询所有商品数据
        GoodsDao goodsDao = new GoodsDaoImpl();
        List<Goods> goodsList = goodsDao.findGoodsAll();

        //遍历（用户购物项要和商品进行对应，然后把商品装车到购物车中）
        //这种做法效率慢
//        if (cartList != null){
//            //遍历购物车集合
//            for (Cart cart : cartList) {
//                //遍历商品集合
//                for (Goods goods : goodsList) {
//                    if (cart.getPid()==goods.getId()){
//                        //将商品对象放入到对应uid用户的购物项对象中
//                        cart.setGoods(goods);
//                    }
//                }
//
//            }
//        }

        /**
         * 优化方案，优化代码的执行效率。遍历次数=cartList集合中的个数+goodsList集合中的个数
         * 将数据量多的集合，放入Map<String,Goods>中（商品是多于用户购物项的，因为用户不一定加购所有的商品）
         * 遍历另一个集合，在遍历的过程中，直接从Map中get数据
         * 时间空间复杂度：
         * 时间：程序执行的快慢可以用时间表示，执行的时间越少，说明执行效率越高
         *
         * 空间：程序存储需要占用的磁盘或者内存空间，当然是占用越少越好
         * List时间复杂度O（n）
         * Map时间复杂度O（1）
         *
         */
        //Map：用来放商品
        Map<String,Goods> goodsMap = new HashMap<>();
        if (goodsList!=null){
            for (Goods goods : goodsList) {
                //以商品id作为key，以商品对象作为value
                goodsMap.put(String.valueOf(goods.getId()), goods);
            }
        }
        if (cartList != null){
            for (Cart cart : cartList) {
                //通过购物项的商品id-pid到商品集合goodsMap中取商品作为购物车中的商品对象
                Goods goods = goodsMap.get(String.valueOf(cart.getPid()));
                if (goods!=null){
                    //如果商品对象不为空，那么放入购物车对象中
                    cart.setGoods(goods);
                }
            }
        }


        return cartList;
    }

    @Override
    public void updateCart(Integer cid, Integer num) {

        //1:根据cid，到数据库查询这个购物项的数据
        CartDao cartDao = new CartDaoImpl();
        Cart cart = cartDao.findById(cid);


        //2:根据查询到购物项的，商品id，到商品表中查询对应的商品数据（价格防止黑客篡改）
        GoodsDao goodsDao = new GoodsDaoImpl();
        Goods goods = goodsDao.findById(cart.getPid());
        //3：重新计算总价=商品单价*商品购买数量
        cart.setNum(num);
        cart.setGoods(goods);
        cart.setMoney(goods.getPrice()*num);
        cartDao.updateCart(cart);

    }

    @Override
    public void deleteById(Integer id) {
        CartDao cartDao = new CartDaoImpl();
        cartDao.deleteById(id);
    }
}
